<?php
if (!defined('__TYPECHO_ROOT_DIR__')) {
    exit;
}

/**
 * 下载短代码插件
 * 提供下载按钮功能，直接输出HTML结构
 * 使用方法：[download url="文件链接" name="显示文本"]
 * 
 * @package Download
 * @author 蔥籽
 * @version 1.2.4
 * @link https://chencong.blog
 */
class Download_Plugin implements Typecho_Plugin_Interface
{
    /**
     * 激活插件
     * 
     * @access public
     * @return string 激活成功消息
     * @throws Typecho_Plugin_Exception
     */
    public static function activate()
    {
        // 注册内容解析钩子
        Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = [__CLASS__, 'parseContent'];
        
        return _t('下载短代码插件已激活，使用方法：[download url="文件链接" name="显示文本"]');
    }

    /**
     * 禁用插件
     * 
     * @access public
     * @return void
     */
    public static function deactivate()
    {
        // 插件禁用时无需特殊处理
    }
    
    /**
     * 插件配置面板
     * 
     * @access public
     * @param Typecho_Widget_Helper_Form $form 配置表单对象
     * @return void
     */
    public static function config(Typecho_Widget_Helper_Form $form)
    {
        // 无配置选项
    }
    
    /**
     * 个人用户配置面板
     * 
     * @access public
     * @param Typecho_Widget_Helper_Form $form 配置表单对象
     * @return void
     */
    public static function personalConfig(Typecho_Widget_Helper_Form $form)
    {
        // 个人配置留空
    }
    
    /**
     * 解析文章内容中的短代码
     * 
     * @access public
     * @param string $content 文章内容
     * @param Widget_Abstract_Contents $widget 内容对象
     * @return string 处理后的内容
     */
    public static function parseContent($content, $widget)
    {
        if (empty($content)) {
            return $content;
        }
        
        // 匹配并替换短代码
        return preg_replace_callback(
            '/\[download\s+(.*?)\]/i',
            [__CLASS__, 'renderButton'],
            $content
        );
    }
    
    /**
     * 渲染下载按钮
     * 
     * @access private
     * @param array $matches 正则匹配结果
     * @return string HTML按钮代码
     */
    private static function renderButton($matches)
    {
        // 解析短代码参数
        $shortcodeParams = self::parseShortcodeParameters($matches[1]);
        
        // 验证并清理参数
        $downloadUrl = self::sanitizeUrl(empty($shortcodeParams['url']) ? '#' : $shortcodeParams['url']);
        $displayText = self::sanitizeText(empty($shortcodeParams['name']) ? '下载文件' : $shortcodeParams['name']);
        
        // 构建基础链接属性
        $linkAttributes = [
            'href' => $downloadUrl,
            'rel' => 'noopener noreferrer',
            'target' => '_blank'  // 固定新窗口打开
        ];
        
        // 构建属性字符串
        $attributeString = self::buildAttributeString($linkAttributes);
        
        // 构建按钮内容
        $buttonContent = $displayText;
        
        // 将图片和链接封装在一个容器层中
        return '<div class="download-container" style="display: inline-flex; align-items: center; gap: 6px; margin: 5px 0;">
                    <img src="/usr/plugins/Download/img/download.png" 
                         alt="下载图标" 
                         style="width: auto; height: auto; border: none;">
                    <a ' . $attributeString . '>点此下载 ' . $buttonContent . '</a>
                </div>';
    }
    
    /**
     * 解析短代码参数
     * 
     * @access private
     * @param string $parameterString 参数字符串
     * @return array 参数数组
     */
    private static function parseShortcodeParameters($parameterString)
    {
        $parameters = [];
        $pattern = '/(\w+)\s*=\s*"([^"]*)"/i';
        
        preg_match_all($pattern, $parameterString, $matches, PREG_SET_ORDER);
        
        foreach ($matches as $match) {
            $parameters[strtolower($match[1])] = $match[2];
        }
        
        return $parameters;
    }
    
    /**
     * 清理URL参数
     * 
     * @access private
     * @param string $url 原始URL
     * @return string 清理后的URL
     */
    private static function sanitizeUrl($url)
    {
        $url = trim($url);
        
        // 验证URL格式
        if (filter_var($url, FILTER_VALIDATE_URL) === false) {
            return '#';
        }
        
        return htmlspecialchars($url, ENT_QUOTES, 'UTF-8');
    }
    
    /**
     * 清理文本参数
     * 
     * @access private
     * @param string $text 原始文本
     * @return string 清理后的文本
     */
    private static function sanitizeText($text)
    {
        return htmlspecialchars(trim($text), ENT_QUOTES, 'UTF-8');
    }
    
    /**
     * 构建HTML属性字符串
     * 
     * @access private
     * @param array $attributes 属性数组
     * @return string 属性字符串
     */
    private static function buildAttributeString(array $attributes)
    {
        $attributeParts = [];
        
        foreach ($attributes as $key => $value) {
            $attributeParts[] = "{$key}=\"{$value}\"";
        }
        
        return implode(' ', $attributeParts);
    }
}
